package band.wukong.practice.javase.core.io.stream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * Desc:
 * Author: sunjs
 * Date: 2009-11-13 16:03:40
 */
public class TestByteArrayStream {
    public static void main(String[] args) throws Exception {
        testOutputStream();
//        testInputStream();
//        testByte();
    }

    public static void testOutputStream() throws Exception {
        byte[] buff = new byte[]{2, 15, 67, -1, -9, 9};
        ByteArrayInputStream in = new ByteArrayInputStream(buff, 1, 4);
        int data = in.read();
        while (data != -1) {
            System.out.println(data + "");
            data = in.read();
        }
        in.close();
        /*
            以上字节数组输入流从字节数组buff下标为1的元素开始读，一共读取4个元素。
            对于独到的每一个元素类型，都会转换成int类型。
            例如：字节类型的15，二进制形式为00001111，
            转换成二进制就是00000000 00000000 00000000 00001111
            因此字节类型的15转换成int类型仍然是15
         */
    }

    public static void testInputStream() throws Exception {
        //创建输出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        //把字符串的UTF-8字符编码写到字节数组中
        out.write("大海航行靠舵手".getBytes());
        //获得字节数组
        byte[] buffOutput = out.toByteArray();
        //ByteArrayOutputStream的close()方法不进行任何操作
        out.close();

        //创建输入流
        ByteArrayInputStream in = new ByteArrayInputStream(buffOutput);
        //创建输出数组
        byte[] buffInput = new byte[in.available()];
        //把字节中的数据读到in中
        in.read(buffInput);
        //ByteArrayInputStream的close()方法不进行任何操作
        in.close();

        System.out.println(new String(buffOutput, "UTF-8"));
        System.out.println(new String(buffInput, "UTF-8"));
    }

    public static void testByte() throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        out.write(259);

        byte[] buff = out.toByteArray();    //获得字符串数组
        System.out.println("buff.length = " + buff.length);

        ByteArrayInputStream in = new ByteArrayInputStream(buff);
        int data;
        while ((data = in.read()) != -1) {
            System.out.println("data = " + data);
        }
        in.close();
        /*
            在执行out.write(259)方法时，write()会指向输出流写入一个字节。
            259是int型，其二进制形式为：00000000 00000000 00000001 00000011。
            write()方法截取后8位，以你write()方法实际上向输出流写入的字节为3。
            [output:
                buff.length=1
                3
            ]
         */
    }
}
